#include "widget.h"
#include "./ui_widget.h"
#include <QMessageBox>
#include <QFrame>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

#include <QCoreApplication>
#include <QCryptographicHash>
#include <QDebug>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    setWindowTitle("登录/注册系统");
    setMinimumSize(500, 400); // 设置窗口最小尺寸

    // 初始化多页面容器
    stackedWidget = new QStackedWidget(this);

    // ========== 登录页面 ==========
    loginPage = new QWidget();
    QFormLayout *loginLayout = new QFormLayout();

    // 登录表单容器（用于居中和对齐）
    QFrame *loginFrame = new QFrame();
    loginFrame->setFrameShape(QFrame::StyledPanel);
    loginFrame->setMaximumWidth(550); // 设置最大宽度

    QVBoxLayout *loginFrameLayout = new QVBoxLayout(loginFrame);
    loginFrameLayout->setAlignment(Qt::AlignCenter); // 内容居中

    loginUsername = new QLineEdit();
    loginPassword = new QLineEdit();
    loginPassword->setEchoMode(QLineEdit::Password);

    loginButton = new QPushButton("登录");
    toRegisterButton = new QPushButton("去注册");

    loginLayout->addRow("用户名:", loginUsername);
    loginLayout->addRow("密码:", loginPassword);
    loginLayout->addRow(loginButton);
    loginLayout->addRow(toRegisterButton);

    loginFrameLayout->addLayout(loginLayout);
    loginFrameLayout->addStretch(); // 添加弹性空间

    QVBoxLayout *loginPageLayout = new QVBoxLayout(loginPage);
    loginPageLayout->addWidget(loginFrame, 0, Qt::AlignCenter); // 表单居中

    // ========== 注册页面 ==========
    registerPage = new QWidget();
    QFormLayout *registerLayout = new QFormLayout();

    // 注册表单容器
    QFrame *registerFrame = new QFrame();
    registerFrame->setFrameShape(QFrame::StyledPanel);
    registerFrame->setMaximumWidth(550); // 设置最大宽度

    QVBoxLayout *registerFrameLayout = new QVBoxLayout(registerFrame);
    registerFrameLayout->setAlignment(Qt::AlignCenter);

    registerUsername = new QLineEdit();
    registerPassword = new QLineEdit();
    registerPassword->setEchoMode(QLineEdit::Password);
    confirmPassword = new QLineEdit();
    confirmPassword->setEchoMode(QLineEdit::Password);

    registerButton = new QPushButton("注册");
    toLoginButton = new QPushButton("返回登录");

    registerLayout->addRow("用户名:", registerUsername);
    registerLayout->addRow("密码:", registerPassword);
    registerLayout->addRow("确认密码:", confirmPassword);
    registerLayout->addRow(registerButton);
    registerLayout->addRow(toLoginButton);

    registerFrameLayout->addLayout(registerLayout);
    registerFrameLayout->addStretch();

    QVBoxLayout *registerPageLayout = new QVBoxLayout(registerPage);
    registerPageLayout->addWidget(registerFrame, 0, Qt::AlignCenter);

    // 将页面添加到堆栈
    stackedWidget->addWidget(loginPage);
    stackedWidget->addWidget(registerPage);
    stackedWidget->setCurrentIndex(0);  // 默认显示登录页

    // 主布局
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(stackedWidget);
    setLayout(mainLayout);

    // 连接信号槽
    connect(toRegisterButton, &QPushButton::clicked, this, &Widget::switchToRegister);
    connect(toLoginButton, &QPushButton::clicked, this, &Widget::switchToLogin);
    connect(loginButton, &QPushButton::clicked, this, &Widget::attemptLogin);
    connect(registerButton, &QPushButton::clicked, this, &Widget::attemptRegister);
}

Widget::~Widget() {
    delete ui;
}

// ========== 槽函数实现 ==========
void Widget::switchToRegister() {
    stackedWidget->setCurrentIndex(1);  // 切换到注册页
}

void Widget::switchToLogin() {
    stackedWidget->setCurrentIndex(0);  // 切换到登录页
}

QString hashString(const QString& input) {
    QByteArray data = input.toUtf8();
    QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Sha256);
    return hash.toHex(); // 转为16进制字符串
}

void Widget::attemptLogin() {
    QString username = loginUsername->text().trimmed();
    QString password = loginPassword->text();

    if (username.isEmpty() || password.isEmpty()) {
        QMessageBox::warning(this, "错误", "用户名或密码不能为空！");
    } else {

        QString hashed = hashString(password);

        QJsonObject json; // 构造JSON格式的请求体
        json["username"] = username;  // 添加用户名字段
        json["password"] = hashed;  // 添加密码字段

        QNetworkRequest request(QUrl("http://10.11.17.102:5000/login")); // 创建网络请求对象，设置目标URL

        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); // 设置HTTP请求头，声明内容类型为JSON

        QNetworkAccessManager *manager = new QNetworkAccessManager(this); // 创建网络访问管理器（用于发送请求）

        connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply) {  // 连接请求完成的信号到Lambda槽函数
            QByteArray response = reply->readAll(); // 读取服务器返回的所有数据

            QJsonDocument doc = QJsonDocument::fromJson(response); // 将JSON数据解析为文档对象

            if (doc.object()["status"] == "success") {
                QMessageBox::information(this, "成功", "登录成功！");
            } else {
                QMessageBox::warning(this, "错误", doc.object()["message"].toString());
            }

            reply->deleteLater(); // 释放reply对象（重要！避免内存泄漏）
        });

        manager->post(request, QJsonDocument(json).toJson()); // 发送POST请求（将JSON数据转换为字节数组）

        // 注意：manager对象由Qt父对象机制自动管理，不需要手动释放
    }
}

void Widget::attemptRegister() {
    QString username = registerUsername->text().trimmed();
    QString password = registerPassword->text();
    QString confirm = confirmPassword->text();

    if (username.isEmpty() || password.isEmpty()) {
        QMessageBox::warning(this, "错误", "用户名或密码不能为空！");
    } else if (password != confirm) {
        QMessageBox::warning(this, "错误", "两次输入的密码不一致！");
    } else {
        QString hashed = hashString(password);

        QJsonObject json; // 构造JSON格式的请求体
        json["username"] = username;  // 添加用户名字段
        json["password"] = hashed;  // 添加密码字段

        QNetworkRequest request(QUrl("http://10.11.17.102:5000/register")); // 创建网络请求对象，设置目标URL

        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); // 设置HTTP请求头，声明内容类型为JSON

        QNetworkAccessManager *manager = new QNetworkAccessManager(this); // 创建网络访问管理器（用于发送请求）

        connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply) {  // 连接请求完成的信号到Lambda槽函数
            QByteArray response = reply->readAll(); // 读取服务器返回的所有数据

            QJsonDocument doc = QJsonDocument::fromJson(response); // 将JSON数据解析为文档对象

            if (doc.object()["status"] == "success") {
                QMessageBox::information(this, "成功", "注册成功！");
                 switchToLogin();  // 自动跳转到登录页
            } else {
                QMessageBox::warning(this, "错误", doc.object()["message"].toString());
            }

            reply->deleteLater(); // 释放reply对象（重要！避免内存泄漏）
        });

        manager->post(request, QJsonDocument(json).toJson()); // 发送POST请求（将JSON数据转换为字节数组）

        // 注意：manager对象由Qt父对象机制自动管理，不需要手动释放
    }
}
